// Copyright 2019 by 马万里. All rights reserved.
// 开发团队 ：   鸡中之霸
// 开发人员 ：   马万里
// 开发时间 ：   2019-03-06 10:02
// 文件名称 ：   aes_ctr.go
// 工程名称 ：   goCryptor
// 开发工具 ：   GoLand
//

package aes

import (
	"crypto/aes"
	"crypto/cipher"
	"errors"
	"fmt"
)

func EnCriptAESCTR(key, iv, src []byte) ([]byte, error) {

	// 1. 获取aes的block接口实例
	block, e := aes.NewCipher(key)
	if e != nil {
		return nil, e
	}
	if len(iv) != block.BlockSize() {
		return nil, errors.New(fmt.Sprintf("iv长度应该为%d个字节\n", block.BlockSize()))
	}

	// 2. 获取ctr分组模式的blockMode
	ctr := cipher.NewCTR(block, iv)

	// 3. 加密
	ctr.XORKeyStream(src, src)

	return src, nil
}

func DeCriptAESCTR(key, iv, src []byte) ([]byte, error) {

	// 1. 获取aes的block接口实例
	block, e := aes.NewCipher(key)
	if e != nil {
		return nil, e
	}
	if len(iv) != block.BlockSize() {
		return nil, errors.New(fmt.Sprintf("iv长度应该为%d个字节\n", block.BlockSize()))
	}

	// 2. 获取ctr分组模式的blockMode
	ctr := cipher.NewCTR(block, iv)

	// 3. 加密
	ctr.XORKeyStream(src, src)

	return src, nil
}
